/**
 * This file is part of 1genia trampoline
 * Copyright (C) 2007 1genia (contact@1genia.com)
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; version 3 of the License. 
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details. 
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; see the file COPYING.TXT.  If not,
 * write to the Free Software Foundation, Inc., 51 Franklin Street,
 * Fifth Floor, Boston, MA 02110-1301, USA. 
 **/
package com.genia.toolbox.persistence.hibernate.mapping.type;

/**
 * Abstract class that allows to map an object of type {@link Enum} to a column
 * of type {@link Short}.
 * 
 * @param <E>
 *          the class of the {@link Enum}.
 */
public abstract class AbstractEnumUserTypeById<E extends Enum<E>>
    extends AbstractObjectUserTypeById<E>
{

  /**
   * Implementation of {@link IdGettable} for an {@link Enum} class.
   * 
   * @param <E>
   *          the class of the {@link Enum}
   */
  private static class EnumIdGetter<E extends Enum<E>>
      implements IdGettable<E>
  {

    /**
     * the class of the {@link Enum}.
     */
    private Class<E> classz;



    /**
     * Constructor.
     * 
     * @param classz
     *          the class of the {@link Enum}
     */
    public EnumIdGetter(Class<E> classz)
    {
      this.classz = classz;
    }



    /**
     * returns the short identifier of the object.
     * 
     * @param object
     *          the object the identifier is looked for
     * @return the id of the object
     */
    public short getId(E object)
    {
      return (short) object.ordinal();
    }



    /**
     * returns an object givent its id.
     * 
     * @param id
     *          is of the object
     * @return the object having the given identifier
     */
    public E getObject(short id)
    {
      return classz.getEnumConstants()[id];
    }

  }



  /**
   * constructor.
   * 
   * @param c
   *          the class of the {@link Enum}
   */
  protected AbstractEnumUserTypeById(Class<E> c)
  {
    super(c, new EnumIdGetter<E>(c));
  }

}
